package br.com.californiahotel.server.serviceImpl;

import java.util.ArrayList;
import java.util.Date;
import java.util.List;

import br.com.californiahotel.client.service.ApartamentoService;
import br.com.californiahotel.server.hibernate.DatabaseUtils;
import br.com.californiahotel.server.hibernate.models.Apartamento;
import br.com.californiahotel.server.hibernate.models.Tipo;
import br.com.californiahotel.server.utils.Conversor;

import com.google.gwt.user.server.rpc.RemoteServiceServlet;

@SuppressWarnings("serial")
public class ApartamentoServiceImpl extends RemoteServiceServlet implements
ApartamentoService {

	private static final DatabaseUtils<Tipo> TYPE_DATABASE = new DatabaseUtils<Tipo>();
	private static final Class<Tipo> TIPO_CLASS = br.com.californiahotel.server.hibernate.models.Tipo.class;
	private static final Class<Apartamento> APARTAMENTO_CLASS = br.com.californiahotel.server.hibernate.models.Apartamento.class;
	private static final DatabaseUtils<Apartamento> DATABASE = new DatabaseUtils<Apartamento>();
	private static final Conversor CONVERSOR = new Conversor();

	@Override
	public boolean save(br.com.californiahotel.shared.models.Apartamento model) {
		try {
			Apartamento apto = CONVERSOR.convertApartamentoModelToApartamentoHibernate(model);
			apto.setTipo(TYPE_DATABASE.find(Tipo.class, model.getTipo().getCdTipo()));
			DATABASE.save(apto);
		} catch (Exception e) {
			e.printStackTrace();
			return false;
		}
		return true;
	}

	@Override
	public boolean edit(br.com.californiahotel.shared.models.Apartamento model, String id) {
		try {
			DATABASE.removeById(APARTAMENTO_CLASS, id);
			DATABASE.save((Apartamento)CONVERSOR.convertModelToHibernate( model, APARTAMENTO_CLASS));
		} catch (Exception e) {
			e.printStackTrace();
			return false;
		}
		return true;
	}

	@Override
	public List<br.com.californiahotel.shared.models.Apartamento> findAll() {
		ArrayList<br.com.californiahotel.shared.models.Apartamento> ApartamentoList = new ArrayList<br.com.californiahotel.shared.models.Apartamento>();
		List<Apartamento> findAll = DATABASE.findAll(APARTAMENTO_CLASS);
		for (Apartamento Apartamento : findAll) {
			ApartamentoList.add(CONVERSOR.convertApartamentoHibernateToApartamentoModel(Apartamento));
		}
		return ApartamentoList;
	}

	@Override
	public boolean delete(Integer key) {
		try {
			DATABASE.removeById(APARTAMENTO_CLASS, key);
		} catch (Exception e) {
			e.printStackTrace();
			return false;
		}
		return true;
	}

	@Override
	public List<br.com.californiahotel.shared.models.Tipo> findAllTypes() {
		ArrayList<br.com.californiahotel.shared.models.Tipo> tipoList = new ArrayList<br.com.californiahotel.shared.models.Tipo>();
		List<Tipo> findAll = TYPE_DATABASE.findAll(TIPO_CLASS);
		for (Tipo tipo : findAll) {
			tipoList.add((br.com.californiahotel.shared.models.Tipo) CONVERSOR.convertHibernateToModel(tipo, br.com.californiahotel.shared.models.Tipo.class));
		}
		return tipoList;
	}

	@Override
	public List<br.com.californiahotel.shared.models.Apartamento> findDisponiblesByDate(Date date) {
		ArrayList<br.com.californiahotel.shared.models.Apartamento> ApartamentoList = new ArrayList<br.com.californiahotel.shared.models.Apartamento>();
		List<Apartamento> findAll = DATABASE.executeQuery(APARTAMENTO_CLASS,"select * from apartamento a where a.numeroApartamento not in (select r.apartamento_numeroApartamento from reserva r where r.data=?)",date);
		for (Apartamento Apartamento : findAll) {
			ApartamentoList.add(CONVERSOR.convertApartamentoHibernateToApartamentoModel(Apartamento));
		}
		return ApartamentoList;
	}

}
